<template>
  <!--卡片区-->
  <el-card class="box-card">
    <!--命名插槽，头部内容设置-->
    <div slot="header" class="clearfix">
      <span>账户信息</span>
    </div>
    <!--匿名插槽，卡片主体内容-->
    <div class="text item cardbody">
      <div id="lt">
        <el-form ref="accountFormRef" :model="accountForm" label-width="100px" :rules="accountFormRules">
          <el-form-item label="用户名：" prop='name'>
            <el-input v-model="accountForm.name"></el-input>
          </el-form-item>
          <el-form-item label="手机号码：" prop='mobile'>
            <el-input v-model="accountForm.mobile" disabled></el-input>
          </el-form-item>
          <el-form-item label="邮箱：" prop='email'>
            <el-input v-model="accountForm.email"></el-input>
          </el-form-item>
          <el-form-item label="简介：" prop='intro'>
            <el-input type="textarea" v-model="accountForm.intro"></el-input>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="upAccount()">更新账户</el-button>
          </el-form-item>
        </el-form>
      </div>
      <div id="rt">
        <!-- action=""必须，发送请求方式为post，文档要求请求方式为patch，所以不能用，可设置为空，
        用属性http-request覆盖默认上传行为 -->
        <el-upload
          action=""
          :show-file-list="false"
          :http-request="httpRequest">
          <img v-if="accountForm.photo" :src="accountForm.photo" class="avatar" width="250px" height="250px">
          <i v-else class="el-icon-plus avatar-uploader-icon"></i>
        </el-upload>
      </div>
      </div>
  </el-card>
</template>

<script>
// 引入bus.js
import bus from '@/utils/bus.js'
export default {
  name: 'Account',
  created () {
    this.getAccount()
  },
  data: function () {
    return {
      accountForm: {
        name: '',
        mobile: '',
        email: '',
        intro: '',
        photo: ''
      },
      accountFormRules: {
        name: [
          { required: true, message: '名字必填' },
          // 后端要求title长度介于1-7个字符
          {
            min: 1,
            max: 7,
            message: '名字长度介于1-7个字符之间'
          }
        ],
        email: [
          { required: true, message: '邮箱必填' },
          { type: 'email', message: '邮箱格式不正确' }
        ]
        /*
  mobile: [
    { required: true, message: '手机号码必填' },
    { pattern: /^1[35789]\d{9}$/, message: '手机号码格式不对' }
  ] */
      }
    }
  },

  methods: {
    // 上传行为，覆盖默认上传行为action
    // resource是一个对象，包含当前正在上传的图片信息resource.file
    httpRequest (resource) {
      // 使用formdata进行文件上传
      var fd = new FormData()
      // 添加图片
      fd.append('photo', resource.file)
      // 文件已被fd保存
      // 发送到服务端
      let pro = this.$http.patch('/user/photo', fd)
      pro
        .then(result => {
          if (result.data.message === 'OK') {
            this.accountForm.photo = result.data.data.photo
            // bus通过$emit调用自己的相关方法更新   首页home  的头像信息
            bus.$emit('upAccountPhoto', result.data.data.photo)
            this.$message.success('头像更新成功')
          }
        })
        .catch(err => {
          return this.$message.error('头像更新失败' + err)
        })
    },
    // 点击按钮更新账户信息
    upAccount () {
      this.$refs.accountFormRef.validate(valid => {
        if (valid) {
          let pro = this.$http.patch('/user/profile', this.accountForm)
          pro
            .then(
              result => {
                if (result.data.message === 'OK') {
                  // 当页面更新成功时，将值传给home
                  bus.$emit('upAccountName', result.data.data.name)
                  // this.getAccount()
                  this.$message.success('更新成功')
                }
              }
            )
            .catch(err => {
              return this.$message.error('更新账户信息失败' + err)
            })
        }
      })
    },
    // 获取账户信息
    getAccount () {
      let pro = this.$http.get('/user/profile')
      pro
        .then(result => {
          if (result.data.message === 'OK') {
            this.accountForm = result.data.data
          }
        })
        .catch(err => {
          return this.$message.error('获取账户信息错误' + err)
        })
    }
  }
}
</script>

<style lang="less" scoped>
// 给表单 和 头像区域做布局样式设计
.cardbody {
  display: flex;
  justify-content: space-between;
  #lt {
    width: 40%;
    background-color: pink;
  }
  #rt {
    width: 30%;
    // background-color: lightgreen;
  }
}
</style>
